#include <iostream>
using namespace std;

class Student{
    private:
        int id;
        int score;
    public:
        Student(){cout << "Student 无参构造" <<endl;}
        Student(int i, int s):id(i), score(s){
            cout << "222 this :" << this << endl;
            cout << "Student 有参构造" <<endl;
        }
};

class Teacher{
    private:
        string name;
        Student s; // 成员子对象(其他类的对象作为本类的成员)
    public:
        Teacher(){cout << "Teacher 无参构造" <<endl;}
        #if 0
        // 这种写法 会调用Student的无参构造函数 来完成对s成员的初始化
        Teacher(string n, int i, int s):name(n){
            cout << "Teacher 有参构造" <<endl;
        }
        #else 
        // 这种写法 会调用Student的有参构造函数 来完成对s成员的初始化
        Teacher(string n, int i, int s):name(n), s(i, s){ // 只能在初始化列表中调用Student的有参构造
            cout << "Teacher 有参构造" <<endl;
            cout << "111  &s : " << &(this->s) << endl;
            // s.Student(i, s); // 构造函数不允许用这种方式调用
        }
        #endif
};

int main(int argc, const char *argv[]){
    Teacher t1; // 会调用 Student 和 Teacher 的无参构造
    cout << "---------------" << endl;
    // 会调用 Teacher 的有参构造
    Teacher t2("杨老师", 1001, 98);
    
    return 0;
}